{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3b2848d4",
   "metadata": {},
   "source": [
    "# 使用窗函数设计FIR低通滤波器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "4f36f914",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#导入使用的库\n",
    "import numpy as np;from math import *\n",
    "from scipy import signal,fft\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.ticker import MaxNLocator\n",
    "\n",
    "#滤波器参数\n",
    "wp = 0.3*pi;ws = 0.5*pi; #通带和阻带截止频率\n",
    "wc = (wp+ws)/2;Bt = np.abs(wp-ws) #截止频率和过渡带宽\n",
    "\n",
    "#由阻带衰减As = 40，可以确定窗形状为汉宁窗\n",
    "N = np.ceil((6.6*pi)/Bt)+1;N = int(N+(N+1)%2)#滤波器长度点数（取奇数）\n",
    "wn = signal.windows.hann(N) #汉宁窗的wn值\n",
    "\n",
    "#理想低通滤波器的单位取样响应\n",
    "t = int((N-1)/2)\n",
    "n1 = np.arange(N);n1 = np.delete(n1,t)\n",
    "hd = np.sin(wc*(n1-t))/(pi*(n1-t))\n",
    "hd = np.insert(hd,t,wc/pi)\n",
    "\n",
    "#线性相位FIR滤波器\n",
    "h = hd*wn;N0 = N*1000\n",
    "He = np.abs(fft.fft(h,N0));He = He/np.max(He)\n",
    "Ar = 20*np.log10(He);N1 = int(N0/2)\n",
    "f = np.linspace(0,1,N1)\n",
    "\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False #用来显示负号\n",
    "\n",
    "#绘制滤波器的幅度响应\n",
    "fig,ax = plt.subplots();ax.plot(f,Ar[:N1]);ax.grid()\n",
    "ax.set_title('使用汉宁窗设计的FIR滤波器的幅度响应');ax.set_xlabel('k')\n",
    "ax.set_xlabel(r'$ \\omega / \\pi $')\n",
    "ax.set_ylabel(r'$ 20log_{10}| H (e^{j \\omega}) | $')\n",
    "ax.set_xlim([0,1]);ax.set_ylim([-100,1])\n",
    "ax.xaxis.set_major_locator(MaxNLocator(11))\n",
    "ax.yaxis.set_major_locator(MaxNLocator(11))\n",
    "\n",
    "fig.savefig('./fir_window1.png',dpi=500)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "380823a1",
   "metadata": {},
   "source": [
    "为了更好的满足精度，程序里滤波器的长度N比用汉宁窗过渡带宽公式计算出来的大一些。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
